In [1]:
import numpy as np
%matplotlib notebook
import matplotlib.pyplot as plt
import ipywidgets as widgets
from maux import *

Goniometrické funkcie

V nasledujúcich príkladoch budeme kresliť grafy a vyšetrovať priebeh goniometrických funkcií.

Budeme sa venovať týmto funkciam: $$y = \sin x \\ y = \cos x \\ y = \tan x.$$ Dokumentácia:

Úvodný príklad

Nakreslenie grafu funkcie danej rovnicou $$y = \sin x.$$ Definičným oborom je množina reálnych čísel.

In [2]:
#####
##### nakreslenie grafu funkcie
#####

#### vstupné údaje
def f(X): return np.sin(X) # ufunc verzia funkcie
X = np.linspace(-2*np.pi, 4*np.pi, 12*10+1) # výber hodnôt nezávislej premennej pre zaujímavú časť grafu
Y = f(X) # odpovedajúce hodnoty závislej premennej

#### obrázok s jedným diagramom
fig, ax = plt.subplots()
fig.set_size_inches(9, 2) # veľkosť obrázka (východzia hodnota je 6x4)

### diagram
init_subplot(ax) # inicializácia diagramu: vytvorí sa pravoúhla súradnicová sústava
ax.set_title(r"Graf funkcie $y = \sin\ x$") # pomenovanie diagramu
ax.set_aspect('equal') # nastavenie rovnakej mierky pre obe osi
#ax.grid() # pravoúhla sieť

## x-ová os
xtick_numerators = range(-4, 8+1)
ax.set_xticks([n * np.pi / 2  for n in xtick_numerators]) # kótovanie x-ovej osi
ax.set_xticklabels([smart_ticklabel(n, r"\pi", 2)  for n in xtick_numerators]) # označenie kót na x-ovej osi
#ax.set_xticklabels([r'$-2\pi$', r'$-3\pi/2$', r'$-\pi$', r'$-\pi/2$', r'$0$', r'$\pi/2$', r'$\pi$', r'$3\pi/2$', r'$2\pi$', r'$5\pi/2$', r'$3\pi$', r'$7\pi/2$', r'$4\pi$']) # (takmer) to isté, len zapísané iným komplikovanejším spôsobom

## y-ová os
ax.set_yticks([-1, 0, 1]) # kótovanie y-ovej osi

## graf funkcie
ax.plot(X, Y)

### archivácia obrázka
#fig.savefig("<meno súboru>.png")

### samotné zobrazenie
fig.show()

Pokračovanie predchadzajúceho príkladu

Vyšetrenie priebehu funkcie danej rovnicou $$y = \sin x.$$ Tu nás zaujímajú tieto informácie:

  • intervaly, na ktorých je funkcia monotónna;
  • extrémy funkcie;
  • nulové body funkcie.
In [3]:
#####
##### vyšetrenie priebehu funkcie
#####

#### vstupné údaje
def f(X): return np.sin(X) # ufunc verzia funkcie
X = np.linspace(-2*np.pi, 4*np.pi, 12*10+1) # výber hodnôt nezávislej premennej pre zaujímavú časť grafu
Y = f(X) # odpovedajúce hodnoty závislej premennej

#### obrázok s jedným diagramom
fig, ax = plt.subplots()
fig.set_size_inches(9, 3.5) # veľkosť obrázka (východzia hodnota je 6x4)

### diagram
init_subplot(ax) # inicializácia diagramu: vytvorí sa pravoúhla súradnicová sústava
ax.set_title(r"Priebeh funkcie $y = \sin\ x$") # pomenovanie diagramu
ax.set_aspect('equal') # nastavenie rovnakej mierky pre obe osi
ax.grid() # pravoúhla sieť

## x-ová os
xtick_numerators = range(-4, 8+1)
ax.set_xticks([n * np.pi / 2  for n in xtick_numerators]) # kótovanie x-ovej osi
ax.set_xticklabels([smart_ticklabel(n, r"\pi", 2)  for n in xtick_numerators]) # označenie kót na x-ovej osi

## y-ová os
ax.set_ylim(-1.3, 1.3) # ohraničenie hodnôt pre osu y
ax.set_yticks([-1, 0, 1]) # kótovanie y-ovej osi

## analýza monotónnosti: x-ové súradnice extrémov funkcie vrátane krajných bodov intervalu
ps = [n * np.pi / 2  for n in [-4, -3, -1, 1, 3, 5, 7, 8]]

## intervaly, na ktorých je funkcia rastúca
color = ax.plot([], [], label="rastúca")[0].get_color()
for i in [0, 2, 4, 6]:
    I = X[(ps[i] <= X) & (X <= ps[i+1])]
    ax.plot(I, f(I), c=color)

## intervaly, na ktorých je funkcia klesajúca
color = ax.plot([], [], label="klesajúca")[0].get_color()
for i in [1, 3, 5]:
    I = X[(ps[i] <= X) & (X <= ps[i+1])]
    ax.plot(I, f(I), c=color)

## extrémy
color = ax.plot([], [], 'o', label="maximum, ostré lokálne maximum")[0].get_color()
for i in [1, 3, 5]:
    ax.plot(ps[i], f(ps[i]), 'o', c=color)

color = ax.plot([], [], 'o', label="minimum, ostré lokálne minimum")[0].get_color()
for i in [2, 4, 6]:
    ax.plot(ps[i], f(ps[i]), 'o', c=color)

## nulové body
color = ax.plot([], [], 'o', label="nulový bod")[0].get_color()
for p in [n * np.pi / 2  for n in range(-4, 8+1, 2)]:
    ax.plot(p, 0, 'o', c=color)

## legenda
#ax.legend()
ax.legend(loc=(0.30, -1.35))

### archivácia obrázka
#fig.savefig("<meno súboru>.png")

### samotné zobrazenie
fig.show()

Pokyny pre nasledujúce príklady

V nasledujúcich príkladoch budeme kresliť grafy a vyšetrovať priebeh goniometrických funkcií. Pretože tieto funkcie majú neohraničený definičný obor, budeme pri zostrojovaní grafu každej takejto funkcie vykreslovať len jej zaujímavú časť. Pri vyšetrovaní jej priebehu treba určiť:

  • intervaly, na ktorých je funkcia monotónna;
  • extrémy funkcie;
  • nulové body funkcie;
  • asymptoty grafu funkcie.

Preferujeme algebraickú metódu pri hľadaní význačných bodov. Súradnice bodov, ktoré sú zrejmé z grafu, netreba explicitne uvádzať.

Doporučujeme tiež rozdeliť riešenie do dvoch častí:

  • V prvom obrázku nakreslite graf funkcie.
  • V druhom obrázku vyšetrite jej priebeh.

Úloha (4 body)

Nakreslite graf a vyšetrite priebeh funkcie $$y = \frac{\sin x}{x}$$ na intervale $\langle -4 \pi, 4 \pi \rangle$. Súradnice význačných bodov nevypisujte!

Návod. Na nasledujúcom obrázku je nakreslený graf tejto funkcie.

In [4]:
#####
##### nakreslenie grafu funkcie
#####

#### vstupné údaje
def f(X): return np.sin(X) / X # ufunc verzia funkcie
X = np.linspace(-4*np.pi, 4*np.pi, 8*100+1) # výber hodnôt nezávislej premennej pre zaujímavú časť grafu
X1, X2 = X[X < 0], X[X > 0] # číslo 0 nepatrí do oboru definície
Y1, Y2 = f(X1), f(X2) # odpovedajúce hodnoty závislej premennej

#### obrázok s jedným diagramom
fig, ax = plt.subplots()
fig.set_size_inches(9, 3.5) # veľkosť obrázka (východzia hodnota je 6x4)

### diagram
init_subplot(ax) # inicializácia diagramu: vytvorí sa pravoúhla súradnicová sústava
ax.set_title(r"Graf funkcie $y = \dfrac{\sin\ x}{x}$", fontdict={'verticalalignment': 'bottom'}) # pomenovanie diagramu
#ax.set_aspect('equal') # nastavenie rovnakej mierky pre obe osi
ax.set_aspect(2*np.pi) # nastavenie rôznej mierky pre obe osi
#ax.grid() # pravoúhla sieť

## x-ová os
xtick_numerators = range(-4, 4+1)
ax.set_xticks([n * np.pi / 1  for n in xtick_numerators]) # kótovanie x-ovej osi
ax.set_xticklabels([smart_ticklabel(n, r"\pi", 1)  for n in xtick_numerators]) # označenie kót na x-ovej osi

## y-ová os
#ax.set_yticks([-1, 0, 1]) # kótovanie y-ovej osi

## graf funkcie
color = ax.plot([], [])[0].get_color()
ax.plot(X1, Y1, c=color)
ax.plot(X2, Y2, c=color)
ax.plot(0, 1, 'o', c=color, mfc='w') # číslo 0 nepatrí do oboru definície

### archivácia obrázka
#fig.savefig("<meno súboru>.png")

### samotné zobrazenie
fig.show()

Príklad

Nakreslenie grafu funkcie sínus $$y = \sin nx$$ pre vybrané hodnoty parametrov $n = \frac{1}{2}, 1, 2$ do jedného obrázka.

In [5]:
#####
##### grafy parametrického systému funkcií
#####

#### vstupné údaje
def f(X, n): return np.sin(n * X) # ufunc verzia funkcie
X = np.linspace(-2*np.pi, 4*np.pi, 12*10+1) # výber hodnôt nezávislej premennej pre zaujímavú časť grafu

#### obrázok s jedným diagramom
fig, ax = plt.subplots()
fig.set_size_inches(9, 3) # veľkosť obrázka (východzia hodnota je 6x4)

### diagram
init_subplot(ax) # inicializácia diagramu: vytvorí sa pravoúhla súradnicová sústava
ax.set_title(r"Grafy funkcií $y = \sin\ nx$") # pomenovanie diagramu
ax.set_aspect('equal') # nastavenie rovnakej mierky pre obe osi
#ax.grid() # pravoúhla sieť

## x-ová os
xtick_numerators = range(-4, 8+1)
ax.set_xticks([n * np.pi / 2  for n in xtick_numerators]) # kótovanie x-ovej osi
ax.set_xticklabels([smart_ticklabel(n, r"\pi", 2)  for n in xtick_numerators]) # označenie kót na x-ovej osi

## y-ová os
ax.set_yticks([-1, 0, 1]) # kótovanie y-ovej osi

## grafy funkcií
for n in [1/2, 1, 2]:
    ax.plot(X, f(X, n), label=r"$n = {}$".format(n))

## legenda
#ax.legend()
ax.legend(loc=(0.42, -1.00))

### archivácia obrázka
#fig.savefig("<meno súboru>.png")

### samotné zobrazenie
fig.show()

Príklad

To isté ako v predchadzajúcom príklade, len vykreslenie sa deje pomocou interaktívnych prvkov knižnice ipywidgets.

In [6]:
#####
##### grafy parametrického systému funkcií (interaktívna verzia)
#####

#### vstupné údaje
def f(X, n): return np.sin(n * X) # ufunc verzia funkcie
X = np.linspace(-2*np.pi, 4*np.pi, 12*10+1) # výber hodnôt nezávislej premennej pre zaujímavú časť grafu

#### obrázok s jedným diagramom
fig, ax = plt.subplots()
fig.set_size_inches(9, 2) # veľkosť obrázka (východzia hodnota je 6x4)

### diagram
init_subplot(ax) # inicializácia diagramu: vytvorí sa pravoúhla súradnicová sústava
ax.set_aspect('equal') # nastavenie rovnakej mierky pre obe osi
#ax.grid() # pravoúhla sieť

## x-ová os
xtick_numerators = range(-4, 8+1)
ax.set_xticks([n * np.pi / 2  for n in xtick_numerators]) # kótovanie x-ovej osi
ax.set_xticklabels([smart_ticklabel(n, r"\pi", 2)  for n in xtick_numerators]) # označenie kót na x-ovej osi

## y-ová os
ax.set_yticks([-1, 0, 1]) # kótovanie y-ovej osi

## graf funkcie
def plot_graph(n):
    ax.set_title(r"Graf funkcie $y = \sin\ {}x$".format(n)) # pomenovanie diagramu
    if ax.lines:
        ax.lines[0].set_ydata(f(X, n))
    else:
        ax.plot(X, f(X, 1))

widgets.interact(plot_graph,
                 n=widgets.SelectionSlider(options=[1/2, 1, 2], value=1),
                )

### archivácia obrázka
#fig.savefig("<meno súboru>.png")

### samotné zobrazenie
fig.show()

Úloha

Nakreslite graf a vyšetrite priebeh funkcie $$y = \cos x$$ na intervale $\langle -2 \pi, 4 \pi \rangle$.

Úloha

Nakreslite graf funkcie kosínus $$y = \cos nx$$ na intervale $\langle -2 \pi, 4 \pi \rangle$ pre vybrané hodnoty parametrov $n = \frac{1}{2}, 1, 2$ do jedného obrázka.

Úloha

To isté ako v predchadzajúcom príklade, len vykreslenie nech sa deje pomocou interaktívnych prvkov knižnice ipywidgets.

Úloha

Nakreslite do jedného obrázka grafy funkcií $y = \sin x$ a $y = \cos x$ na intervale $\langle -2 \pi, 4 \pi \rangle$.

Úloha (4 body)

Nakreslite graf funkcie $$y = \sin\, 2x + \sin\ 4x$$ na intervale $\langle - \pi, 2 \pi \rangle$. Vyznačte nulové body tejto funkcie. Ich súradnice nevypisujte!

Návod. Nájdite najprv čísla $a,b,c$ také, že platí: $$\sin\, 2x + \sin\ 4x = a \sin bx \cos cx.$$

Úloha

Nakreslite graf funkcie $$y = \sin 20x + \sin 22x$$ na intervale $\langle - \pi, 2 \pi \rangle$.

Príklad

To isté ako v predchadzajúcich dvoch príkladoch, ale tentokrát pre funkciu $$y = \sin\, ax + \sin\ bx,$$ kde parametre nadobúdajú hodnoty $a \in \{1, \ldots, 20\}$ a $b \in \{1, \ldots, 22\}$. Vykreslenie sa deje pomocou interaktívnych prvkov knižnice ipywidgets.

In [7]:
#####
##### grafy parametrického systému funkcií (interaktívna verzia)
#####

#### vstupné údaje
def f(a, b): return np.sin(a*X) + np.sin(b*X) # ufunc verzia funkcie
X = np.linspace(-np.pi, 2*np.pi, 6*42*100+1) # výber hodnôt nezávislej premennej pre zaujímavú časť grafu

#### obrázok s jedným diagramom
fig, ax = plt.subplots()
fig.set_size_inches(9, 6) # veľkosť obrázka (východzia hodnota je 6x4)

### diagram
init_subplot(ax) # inicializácia diagramu: vytvorí sa pravoúhla súradnicová sústava
#ax.set_aspect('equal') # nastavenie rovnakej mierky pre obe osi
ax.set_aspect(1/2*np.pi) # nastavenie rôznej mierky pre obe osi
ax.grid() # pravoúhla sieť

## x-ová os
xtick_numerators = range(-2, 4+1)
ax.set_xticks([n * np.pi / 2  for n in xtick_numerators]) # kótovanie x-ovej osi
ax.set_xticklabels([smart_ticklabel(n, r"\pi", 2)  for n in xtick_numerators]) # označenie kót na x-ovej osi

## y-ová os
ax.set_ylim(-2.2, 2.2) # ohraničenie hodnôt pre osu y
ax.set_yticks([-2, -1, 0, 1, 2]) # kótovanie y-ovej osi

## graf funkcie
def plot_graph(a, b): 
    ax.set_title(r"Graf funkcie $y = \sin\ {0}x + \sin\ {1}x$".format(a,b)) # pomenovanie diagramu
    if ax.lines:
        ax.lines[0].set_ydata(f(a, b))
    else:
        ax.plot(X, f(2, 4))

widgets.interact(plot_graph,
                 a=widgets.IntSlider(min=1,max=20,step=1,value=2),
                 b=widgets.IntSlider(min=1,max=22,step=1,value=4))

### archivácia obrázka
#fig.savefig("<meno súboru>.png")

### samotné zobrazenie
fig.show()

Príklad

Nakreslenie grafu funkcie $$y = \tan x$$ Definičným oborom je množina všetkých reálnych čísel $x$, pre ktoré $\tan x \ne 0$, t. j. množina $$R \setminus \{\frac{n\pi}{2} \mathbin{;} \text{$n$ je nepárne celé číslo}\}.$$ Obrázok obsahuje tiež asymptoty bez smernice.

In [8]:
#####
##### nakreslenie grafu funkcie
#####

#### vstupné údaje
def f(X): return np.tan(X) # ufunc verzia funkcie
X = np.linspace(-(5/2)*np.pi, (5/2)*np.pi, 10*100+1) # výber hodnôt nezávislej premennej pre zaujímavú časť grafu

#### obrázok s jedným diagramom
fig, ax = plt.subplots()
fig.set_size_inches(9, 9) # veľkosť obrázka (východzia hodnota je 6x4)

### diagram
init_subplot(ax) # inicializácia diagramu: vytvorí sa pravoúhla súradnicová sústava
ax.set_title(r"Graf funkcie $y = \tan\, x$") # pomenovanie diagramu
#ax.set_aspect('equal') # nastavenie rovnakej mierky pre obe osi
ax.set_aspect(1/2*np.pi) # nastavenie rôznej mierky pre obe osi
ax.grid() # pravoúhla sieť

## x-ová os
xtick_numerators = range(-5, 5+1)
ax.set_xticks([n * np.pi / 2  for n in xtick_numerators]) # kótovanie x-ovej osi
ax.set_xticklabels([smart_ticklabel(n, r"\pi", 2)  for n in xtick_numerators]) # označenie kót na x-ovej osi

## y-ová os
ax.set_ylim(-5, 5) # ohraničenie hodnôt pre osu y

## graf funkcie
color = ax.plot([], [])[0].get_color()
for n in range(-5, 5, 2):
    I = X[(n*np.pi/2 < X) & (X < (n+2)*np.pi/2)]
    ax.plot(I, f(I), c=color)

## asymptoty bez smernice
Ay = np.linspace(-5, 5)
for n in range(-5, 5+1, 2):
    Ax = np.ones(len(Ay)) * n * np.pi/2
    ax.plot(Ax, Ay, 'k--', lw=1)

### archivácia obrázka
#fig.savefig("<meno súboru>.png")

### samotné zobrazenie
fig.show()